# 魔法方法 __方法名__()
# 魔法属性:__doc__:类的描述信息
class Person:
    """人类 -- 的描述信息"""
    def __str__(self):
        return 'Person str 返回值'

print(Person.__doc__)

# __module__ 表示当前操作对象所在的模块
# __class__ 表示当前操作对象所在的类

p = Person()
print(p.__module__)
print(p.__class__)

import singleton
t = singleton.Test()
print(t.__module__)
print(t.__class__)

# __str__() 对象的描述信息  如果类中定义了此方法，那么在打印对象时，默认输出该方法的返回值
# 返回值必须是字符串
print(p)

# __del__() 析构函数，程序结束时调用，或者删除某个对象时候调用

# __call__() ：使一个实例对象成为一个可调用对象，就像函数那样
# 可调用对象：函数/内置函数和类都是可调用对象，凡是可以把一对()应用到某个对象身上都可以称之为可调用对象
# callable() 判读一个对象是否是可调用对象
print(callable(p.__str__))
print(callable(p))

class A(object):
    def __call__(self):
        print('A is callable')

a = A()
a() # 调用一个可调用的实例对象，其实就是调用它的__call__()方法
print(callable(a))